#include "lista.h"

void crearLista(lista &L){
L=NULL;
}

bool listaEsVacia(lista L){
    if(L==NULL)
        return true;
    else
        return false;
}

int primerNodoLista(lista L){
    return L->entero;
}

void restoLista(lista &L){
    lista aux;
    aux=L;
    L=L->sig;
    delete aux;
}

void insFrontLista(lista &L, int num){
    lista aux;
    aux=new ent;
    aux->entero=num;
    aux->sig=L;
    L=aux;
}

void insBackLista(lista &L, int num){
lista aux,copia=L;

    aux=new ent;
    aux->entero=num;
    aux->sig=NULL;
    if(copia==NULL)
        L=aux;
    else{
        while(copia->sig!=NULL)
            copia=copia->sig;
        copia->sig=aux;
    }
}

void desplegarLista(lista L){

    while(L!=0){
        printf("%d ",L->entero);
        L=L->sig;
    }
}

bool perteneceRLista(lista L, int num){
    if(L==NULL)
        return false;
    else
        if(L->entero==num)
            return true;
        else
            return perteneceRLista(L->sig,num);
}

int largoLista(lista L){
int lar=0;
    while(L!=NULL){
        L=L->sig;
        lar=lar+1;
    }
    return lar;
}

lista copiarLista(lista L){
lista Lcop;
crearLista(Lcop);
   while (L!=NULL){
        insBackLista(Lcop,L->entero);
        L=L->sig;
   }
return Lcop;
}

void borrarElementoLista(lista &L, int num){
lista aux;
crearLista(aux);

        while(L!=NULL){
            if(L->entero!=num)
                insBackLista(aux,L->entero);
            L=L->sig;
        }
        EliminarTodos(L);           //para que libere la memoria
        L=aux;
}

//------------------------------

void IngresaListaBack(lista &L){
int num;
char continuar;

        printf("Ingrese entero: ");
        scanf("%d",&num);
        fflush(stdin);
        insBackLista(L,num);

        printf("Presione 'ENTER' para continuar o cualquier tecla para terminar: ");
        scanf("%c",&continuar);
        fflush(stdin);

        while (continuar=='\n'){
            printf("Ingrese entero: ");
            scanf("%d",&num);
            fflush(stdin);
            while(perteneceRLista(L,num)){
                printf("El entero ingresado ya pertenece a la lista, los enteros deben ser distintos\n");
                printf("Ingrese entero: ");
                scanf("%d",&num);
                fflush(stdin);
            }

            insBackLista(L,num);

            printf("Presione 'ENTER' para continuar o cualquier tecla para terminar: ");
            scanf("%c",&continuar);
            fflush(stdin);
        }
}

void EliminarTodos(lista &L){
lista aux;
    while(L!=NULL){
        aux=L;
        L=L->sig;
        delete aux;
    }
}

void Tomar(lista L, int num, lista &LN){
int i;

    for(i=0;i<num;i++){
        insBackLista(LN,L->entero);
        L=L->sig;
    }
}

void TomarR(lista L, int &num, lista &LN){

if(num==1)
    insBackLista(LN,L->entero);
else
    if(num>0){
        insBackLista(LN,L->entero);
        num--;
        TomarR(L->sig,num,LN);

    }
}



void BorrarR(lista &L, int num){     //le pongo el & por si esta en la primera posicion, es decir en L, debo modificar el puntero

    if(L->entero==num){
        lista aux;
        crearLista(aux);
        aux=L;
        L=L->sig;
        delete aux;
    }else {
        BorrarR(L->sig,num);
    }
}

bool Iguales(lista L, lista L2){
bool igual=true;

    while(igual&&L!=NULL&&L2!=NULL){
        if(L->entero!=L2->entero)
            igual=false;
        L=L->sig;
        L2=L2->sig;
    }
    if(igual&&L!=L2)
        igual=false;
return igual;

}

bool IgualesR(lista L, lista L2){
    if(L==NULL&&L2==NULL)
        return true;
    else{
        if((L==NULL&&L2!=NULL)||(L!=NULL&&L2==NULL))
            return false;
        else{
            if(L->entero==L2->entero)
                return IgualesR(L->sig,L2->sig);
            else
                return false;
        }
    }
}

int MinimoR(lista L){
int aux;
    if(L->sig==NULL)
        return L->entero;
    else
        aux=MinimoR(L->sig);
        if(aux<=L->entero)
            return aux;
        else
            return L->entero;
}


long int SumaPares(lista L){
long int suma=0;

    if(L->sig!=NULL){
        L=L->sig;                   //me paro en la prim pos par para despues saltear de a dos
        suma=L->entero;
        while(L->sig!=NULL&&L->sig->sig!=NULL){
            L=L->sig->sig;
            suma=suma+L->entero;
        }
    }
    return suma;
}

bool Pertenece(lista L, int num){
bool esta=false;
    while(L!=NULL&&!esta){
        if(L->entero==num)
            esta=true;
        L=L->sig;
    }
    return esta;
}

int NesimoR(lista L, int num){
    if(num==1)
        return L->entero;

    else
        num--;
        return NesimoR(L->sig,num);
}

void Interseccion(lista L1, lista L2, lista &Inter){

    while(L2!=NULL){
        if(Pertenece(L1, L2->entero)){
            insBackLista(Inter,L2->entero);
        }
        L2=L2->sig;
    }

}

void Sustituir(lista L, int asust, int num){
bool esta=false;

    while(L!=NULL&&!esta){
        if(L->entero==asust){
            L->entero=num;
            esta=true;
        }
        L=L->sig;
    }
}

void eliminarLista(lista &L){
lista aux;
    while(L!=NULL){
        aux=L;
        L=L->sig;
        delete aux;
    }
}


int ObtenerEnLista(lista L, int num){  //Precond: num pertenece a L
    if(L->entero==num)
        return L->entero;
    else
        return perteneceRLista(L->sig,num);
};
